#include "iap_update_app_func.h"
#include "Global.h"
#include "my_uart.h"
#include "my_common.h"
#include "string.h"
#include "Cmd_List.h"



UART_PRMT_TYPEDEF update_port_prmt;

/*******************************************************************************
�������ƣ�void update_app_init(void)
�������ܣ���ز�����ʼ��
*******************************************************************************/
void update_app_init(void)
{
	update_port_prmt.pHardwareConfig = MyUart0_HardWare_Config;
	update_port_prmt.pSendByteFunc = MyUart0_SendByte;

	if(NULL != update_port_prmt.pHardwareConfig)
		update_port_prmt.pHardwareConfig(PUDATE_COMX_BOUND);

	
	MyUart0_RegisteRxHandler_Func(update_app_irq_handler);

	update_port_prmt.write_index = 0;
	memset(update_port_prmt.buf,0,sizeof(update_port_prmt.buf));
	update_port_prmt.get_char_state = 0;
	update_port_prmt.get_char_finish = 0;
	update_port_prmt.get_char_err_type = 0;
	update_port_prmt.flg_get_char_statr = 0;	
	update_port_prmt.get_char_timeout_cnt = 0;
//	pc_cmd_prmt_init();
}


void update_app_put_char(unsigned char *pdata,unsigned short len)
{
	unsigned char i=0;
	while(len--)
	{
		update_port_prmt.pSendByteFunc(pdata[i]);
		i++;
	}
}

void get_char_timeout_func(void)
{
	if(update_port_prmt.flg_get_char_statr)
	{
		if(update_port_prmt.get_char_timeout_cnt)
			--update_port_prmt.get_char_timeout_cnt;	
	}
}

void get_char_err_func(void)
{
	update_port_prmt.write_index = 0;
		update_port_prmt.buf[update_port_prmt.write_index] = 0;
		update_port_prmt.get_char_state = 0;
		update_port_prmt.get_char_finish = 0;
		update_port_prmt.get_char_err_type = 1;
		update_port_prmt.flg_get_char_statr = 0;	
}

void update_app_irq_handler(unsigned char data)
{
	static volatile unsigned int package_len=0;
//	update_port_prmt.buf[update_port_prmt.write_index] = data;	
//	update_port_prmt.write_index = (update_port_prmt.write_index + 1) % BUF_SIZE;

	if(update_port_prmt.get_char_finish == 0)
	{
		if(update_port_prmt.get_char_state == 0)
		{
			if(data == HEAD1)      //�ж��Ƿ�Ϊ��ͷ
			{
				update_port_prmt.flg_get_char_statr = 1; 
	    		update_port_prmt.get_char_timeout_cnt = GET_CHAR_TIME_OUT;
				memset(update_port_prmt.buf,0,BUF_SIZE);
	     		update_port_prmt.get_char_state = 1; 
			}
			else                  //�����׽����Ϊ1����⵽�����ݲ�Ϊ��ͷ�򲻽���ָ�����BUF��
			{
				update_port_prmt.write_index = 0;
				update_port_prmt.buf[update_port_prmt.write_index] = 0;
				update_port_prmt.get_char_state = 0;
				update_port_prmt.get_char_finish = 0;
				update_port_prmt.get_char_err_type = 1;
				update_port_prmt.flg_get_char_statr = 0;		
			}
		}
		else if(update_port_prmt.get_char_state == 1)
		{
			if(data == HEAD2)
				update_port_prmt.get_char_state = 2;
	        else 
	        {
	        	update_port_prmt.write_index = 0;
				update_port_prmt.buf[update_port_prmt.write_index] = 0;
				update_port_prmt.get_char_state = 0;
				update_port_prmt.get_char_finish = 0;
				update_port_prmt.get_char_err_type = 1;
				update_port_prmt.flg_get_char_statr = 0;	
	        }
		}
		else if(update_port_prmt.get_char_state == 2)            //��ȡ��CRC32+ָ��
		{
			update_port_prmt.buf[update_port_prmt.write_index++] = data;
			if(update_port_prmt.write_index >= 5)
				update_port_prmt.get_char_state = 3;
		}
		else if(update_port_prmt.get_char_state == 3)       //��ȡ������
		{
	        update_port_prmt.buf[update_port_prmt.write_index++] = data;
			if(update_port_prmt.write_index >= 7)
			{
		        unsigned short tem_h=0,tmp_l=0;
		        tem_h = update_port_prmt.buf[6];
		        tmp_l = update_port_prmt.buf[5];
		        package_len = (tem_h << 8) | tmp_l;
				if(package_len == 0)
		        {
		        	update_port_prmt.write_index = 0;
		          	update_port_prmt.get_char_state = 0;
		            update_port_prmt.get_char_finish = 1;
		          	package_len = 0;
		            update_port_prmt.flg_get_char_statr = 0;
					update_port_prmt.get_char_err_type = 0;
		        }
		        else
		        {
		          	package_len += 7;//(4(crc32)+1(cmd)+2(len))���ݳ���+CRC32(4BYTE)+CMD(1BYTE)+����(2BYTE)Ϊ���ĳ���
		          	update_port_prmt.get_char_state = 4;
		        }
			}
		}
		else if(update_port_prmt.get_char_state == 4)
		{
			update_port_prmt.buf[update_port_prmt.write_index++] = data;
			if(update_port_prmt.write_index >= (package_len))     //д�������������һ��ʱָ����ȡ���
			{
				update_port_prmt.write_index = 0;
				update_port_prmt.get_char_state = 0;
	            update_port_prmt.get_char_finish = 1;
				package_len = 0;
				update_port_prmt.get_char_err_type = 0;
	           	update_port_prmt.flg_get_char_statr = 0;
			}
		}
		
		if(update_port_prmt.write_index >= (BUF_SIZE - 1))
		{
			update_port_prmt.write_index = 0;
			update_port_prmt.buf[update_port_prmt.write_index] = 0;
			update_port_prmt.get_char_state = 0;
			update_port_prmt.get_char_finish = 0;
			update_port_prmt.get_char_err_type = 2;
			update_port_prmt.flg_get_char_statr = 0;
			package_len = 0;
		}
		if(update_port_prmt.flg_get_char_statr)
		{
			if(update_port_prmt.get_char_timeout_cnt == 0)
			{
				update_port_prmt.write_index = 0;
				update_port_prmt.buf[update_port_prmt.write_index] = 0;
				update_port_prmt.get_char_state = 0;
				update_port_prmt.get_char_finish = 0;
				update_port_prmt.get_char_err_type = 3;
				update_port_prmt.flg_get_char_statr = 0;
				package_len = 0;
			}
		}
	}        
}


